1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
use crate::co;
use crate::decl::*;
use crate::gui::{*, iterators::*, spec::*};
use crate::msg::*;
use crate::prelude::*;
/// Exposes item methods of a [`TreeView`](crate::gui::TreeView) control.
///
/// You cannot directly instantiate this object, it is created internally by the
/// control.
pub struct TreeViewItems<'a, T: 'static> {
owner: &'a TreeView<T>,
}
impl<'a, T> TreeViewItems<'a, T> {
#[must_use]
pub(in crate::gui) const fn new(owner: &'a TreeView<T>) -> Self {
Self { owner }
}
/// Adds a new root item by sending a
/// [`tvm::InsertItem`](crate::msg::tvm::InsertItem) message, and returns
/// the newly added item.
pub fn add_root(&self,
text: &str,
icon_index: Option<u32>,
data: T,
) -> TreeViewItem<'a, T>
{
self.owner.raw_insert_item(None, text, icon_index, data)
}
/// Deletes all items by sending a
/// [`tvm::DeleteItem`](crate::msg::tvm::DeleteItem) message.
pub fn delete_all(&self) {
unsafe {
self.owner.hwnd()
.SendMessage(tvm::DeleteItem { hitem: &HTREEITEM::NULL })
}.unwrap();
}
/// Retrieves the total number of items by sending a
/// [`tvm::GetCount`](crate::msg::tvm::GetCount) message.
#[must_use]
pub fn count(&self) -> u32 {
unsafe {
self.owner.hwnd()
.SendMessage(tvm::GetCount {})
}
}
/// Retrieves the number of visible items by sending a
/// [`tvm::GetVisibleCount`](crate::msg::tvm::GetVisibleCount) message.
#[must_use]
pub fn count_visible(&self) -> u32 {
unsafe {
self.owner.hwnd()
.SendMessage(tvm::GetVisibleCount {})
}
}
/// Ends the editing of the item's text by sending a
/// [`tvm::EndEditLabelNow`](crate::msg::tvm::EndEditLabelNow) message.
pub fn end_edit_label_now(&self, save: bool) {
unsafe {
self.owner.hwnd()
.SendMessage(tvm::EndEditLabelNow { save })
}.unwrap();
}
/// Retrieves the item of the given handle.
///
/// **Note:** This method is cheap – even if `htreeitem` is invalid, an
/// object will still be returned. However, operations upon this object will
/// produce no effect.
#[must_use]
pub fn get(&self, hitem: &HTREEITEM) -> TreeViewItem<'a, T> {
TreeViewItem::new(self.owner, unsafe { hitem.raw_copy() })
}
/// Returns an iterator over the selected items.
#[must_use]
pub fn iter_selected(&self,
) -> impl Iterator<Item = TreeViewItem<'a, T>> + 'a
{
TreeViewItemIter::new(self.owner, None, co::TVGN::CARET)
}
/// Returns an iterator over the root items.
#[must_use]
pub fn iter_root(&self) -> impl Iterator<Item = TreeViewItem<'a, T>> + 'a {
TreeViewChildItemIter::new(self.owner, None)
}
}